package com.shetuan.servelt;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.shetuan.bean.Member;
import com.shetuan.dao.CommunityDao;
import com.shetuan.dao.LoginDao; // [NEW] 导入 LoginDao
import com.shetuan.dao.MemberDao;

public class MemberInfoUpdate extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 设置编码（来自第二段的改进）
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        MemberDao memberdao = new MemberDao();
        LoginDao loginDao = new LoginDao(); // [NEW] 实例化 LoginDao
        CommunityDao communityDao = new CommunityDao(); // [NEW] 实例化 CommunityDao

        // [FIXED] 获取用于判断来源的参数
        String from = request.getParameter("from");

        // [NEW] 从Session获取当前会员信息，用于保留表单未提交的字段值（如果需要）
        Member sessionMember = (Member) request.getSession().getAttribute("member");

        try {
            // --- 合并后的关键改动 ---
            // 采用第二段的策略：先从数据库加载该用户的现有信息，避免重置未提交字段

            // 支持两种可能的请求参数名：loginName 和 loginname
            String loginname = request.getParameter("loginName");
            if (loginname == null || loginname.isEmpty()) {
                loginname = request.getParameter("loginname");
            }

            if (loginname == null || loginname.isEmpty()) {
                // 如果没有登录名，无法更新
                request.setAttribute("errorMsg", "更新失败：未提供用户登录名。");
                request.getRequestDispatcher("admin/memberInfo2.jsp").forward(request, response);
                return;
            }

            // 从数据库获取该用户的 *现有* 完整信息
            Member member = memberdao.getMemberByName(loginname);

            if (member == null || member.getLoginName() == null) {
                // 如果用户不存在
                request.setAttribute("errorMsg", "更新失败：未找到用户 " + loginname);
                request.getRequestDispatcher("admin/memberInfo2.jsp").forward(request, response);
                return;
            }

            // 从表单获取要更新的字段（兼容不同表单字段名）
            // 名称
            String realname = firstNonEmpty(request.getParameter("memberName"), request.getParameter("realname"));
            // 性别
            String gender = firstNonEmpty(request.getParameter("memberGender"), request.getParameter("gender"));
            // 年级
            String grade = firstNonEmpty(request.getParameter("memberGrade"), request.getParameter("grade"));
            // 学院
            String institute = firstNonEmpty(request.getParameter("memberInstitute"), request.getParameter("institute"));
            // 地址
            String add = firstNonEmpty(request.getParameter("memberAdd"), request.getParameter("add"));
            // 邮箱
            String email = firstNonEmpty(request.getParameter("memberEmail"), request.getParameter("email"));
            // 电话
            String phone = firstNonEmpty(request.getParameter("memberPhone"), request.getParameter("phone"));

            // 将表单的新值设置到 *已加载的* member 对象上
            // 那些表单中没有的字段 (如 isJoinCommunity) 将保持其从数据库中加载的原始值。
            if (realname != null) member.setMemberName(realname);
            if (gender != null) member.setMemberGender(gender);
            if (grade != null) member.setMemberGrade(grade);
            if (institute != null) member.setMemberInstitute(institute);
            if (add != null) member.setMemberAdd(add);
            if (email != null) member.setMemberEmail(email);
            if (phone != null) member.setMemberPhone(phone);

            // 处理 join community（兼容 jcom 参数）
            String jcom = request.getParameter("jcom");
            if (jcom != null && !jcom.isEmpty()) {
                member.setJoinCommunity(jcom);
                // 如果需要，将社区名转换为对应 id
                try {
                    int jcomId = communityDao.getCommunityIdByCName(jcom);
                    member.setIsJoinCommunity(jcomId);
                } catch (Exception ex) {
                    // 忽略社区id解析错误，保持原值或设为0
                    System.err.println("无法解析 jcom 为 id: " + jcom + " -> " + ex.getMessage());
                }
            } else {
                // 未提交 jcom 表单时，保持数据库中已有的值（已由 getMemberByName 加载）
            }

            // 处理 iscreat 参数（如果表单提交则覆盖，否则保留）
            String iscreatParam = request.getParameter("iscreat");
            if (iscreatParam != null && !iscreatParam.isEmpty()) {
                try {
                    member.setIscreatCommunity(Integer.parseInt(iscreatParam));
                } catch (NumberFormatException nfe) {
                    // 无效则忽略并保留原值
                    System.err.println("无效的 iscreat 参数: " + iscreatParam);
                }
            } // else 保留原值

            // [FIX FOR PROBLEM 1] 处理权限(managerId)更新
            // 支持 managerId（来自 memberInfo.jsp）或 power（来自 memberInfo2.jsp）
            String managerIdStr = firstNonEmpty(request.getParameter("managerId"), request.getParameter("power"));
            int loginUpdateResult = 1; // 默认为1（成功/未尝试）
            boolean permissionUpdateAttempted = false;

            if (managerIdStr != null && !managerIdStr.isEmpty()) {
                // 1. managerId 参数存在 (可能来自 memberInfo.jsp 或 memberInfo2.jsp)
                permissionUpdateAttempted = true;
                try {
                    int managerId = Integer.parseInt(managerIdStr);
                    member.setManagerId(managerId);
                    // 1a. 同时更新 login 表
                    loginUpdateResult = loginDao.updateManagerId(member.getLoginName(), managerId);
                } catch (NumberFormatException nfe) {
                    System.err.println("无效的 Manager ID: " + managerIdStr);
                    // 尝试保留原 managerId（已加载）
                }
            } else {
                // 2. managerId 参数不存在
                // 保留已加载的 member 中的 managerId（已由 getMemberByName 加载）
                if (sessionMember != null) {
                    // 如果 session 中存在 member，确保与 session 中一致（可选）
                    member.setManagerId(sessionMember.getManagerId());
                } else {
                    // 作为后备，尝试从 login 表获取权限
                    try {
                        int power = loginDao.getPower(member.getLoginName());
                        member.setManagerId(power);
                    } catch (Exception ex) {
                        // 忽略，保持已有值
                        System.err.println("无法从 login 表获取权限: " + ex.getMessage());
                    }
                }
            }

            System.out.println("+++member=" + member);

            // 3. 更新 member 表 (现在也包含 manager_id)
            int rs = memberdao.updateMember(member);

            // [FIXED] 修改重定向/转发逻辑
            // 4. 检查 member 表 (rs) 和 login 表 (loginUpdateResult) 是否都更新成功
            if (rs > 0 && (!permissionUpdateAttempted || loginUpdateResult > 0)) {
                System.out.println("result=" + rs);

                // [NEW] 更新成功后，必须重新从数据库获取最新的 Member 对象
                Member updatedMember = memberdao.getMemberByName(member.getLoginName());
                // [NEW] 将 *最新的* Member 对象放回 session
                request.getSession().setAttribute("member", updatedMember);
                System.out.println(updatedMember + "更新成功");

                if ("index".equals(from)) {
                    // 如果来自 index, 重定向回 memberInfo2.jsp
                    response.sendRedirect("admin/memberInfo2.jsp?rs=success");
                } else {
                    // 否则, 保持原逻辑, 重定向到 memberInfo.jsp
                    response.sendRedirect("admin/memberInfo.jsp?rs=success");
                }

            } else {
                if ("index".equals(from)) {
                    // 如果来自 index, 转发回 memberInfo2.jsp
                    request.getRequestDispatcher("admin/memberInfo2.jsp?rs=fail").forward(request, response);
                } else {
                    // 否则, 保持原逻辑, 转发到 memberInfo.jsp
                    request.getRequestDispatcher("admin/memberInfo.jsp?rs=fail").forward(request, response);
                }
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // 出现异常时，向页面反馈一个通用错误信息（可选）
            request.setAttribute("errorMsg", "服务器异常，更新失败。");
            request.getRequestDispatcher("admin/memberInfo2.jsp").forward(request, response);
        }
    }

    /**
     * 辅助：返回第一个非空且非空字符串的参数（可能为 null）。
     */
    private String firstNonEmpty(String... vals) {
        if (vals == null) return null;
        for (String v : vals) {
            if (v != null && !v.isEmpty()) return v;
        }
        return null;
    }
}
